CD-Check remove Tutor 03



  • Autor: |VerTex|
  • Datum: 05.01.2000
  • Email: VerTex.TGC@gmx.net


  • Inhalt

  • 1. Einleitung
  • 2. Programm
  • 3. Tools
  • 4. Tutor
  • 5. Sonstiges



  • Einleitung

    Hey was geht? Ich bin endlich wieder für euch da, mit allen möglichen Grammatischen und Rechtschreibe Fehler (wie gewohnt) aber egal. Ich hätte schon einige Tutorials schreiben können, aber da war nichts aussergewöhnliches.



    Programm

    Heute gibt es zwar keine aussergewöhnliche Methode oder ähnliches aber für das Spiel "Tomb Raider 4" ein zu einfach zu crackender Kopierschutz.



    Tools

  • 1. Wir brauchen eine Normale Installation von "Tomb Raider 4"
  • 2. Wir benötigen aber einige Dateien von der CD auf der HDD...
    Es sind die Verzeichnisse: fmv (Videos, muss nicht sein), dat und audio
    Die Dateien aus dem "Root Verzeichnis": "binkw32.dll", "German.dat", "os.dat" "lang.dat", "script.dat"
  • 2. W32Dasm -> http://203.148.211.201/files/s-w32dsm.zip
  • 3. Einen Hex Editor
  • 4. Eine Programmiersprache, um den crack zu schreiben.




  • Tutor

    Nun wollen wir das Spiel cracken (so das man es ohne CD spielen kann).
  • 1. Schritt, wie immer: Die tomb4.exe dissassemblen mit W32DASM und dann das Spiel ohne CD starten und sehe was passiert! Ohh, eine MessageBoxA Die Sagt: "Bitte legen Sie..."
  • 2. Schritt: Das Spiel wieder starten und wenn die MessageBoxA erscheint im "Win32Dasm Loader" auf den Button "F7 Step Into" klicken. Jetzt auf "Terminate" und man ist wieder im ASM Text von tomb4.exe, aber an der Stelle wo die MsgBoxA aufgerufen wurde.

  • * Possible StringData Ref from Data Obj ->"Tomb Raider - The Last Revelation"
                                      |
    :0048D88F 6844354B00              push 004B3544
    :0048D894 881D84EE4B00            mov byte ptr [004BEE84], bl
    :0048D89A A2AF287500              mov byte ptr [007528AF], al
    :0048D89F 881DA5287500            mov byte ptr [007528A5], bl
    :0048D8A5 891DBC287500            mov dword ptr [007528BC], ebx
    :0048D8AB E8A00B0000              call 0048E450
    :0048D8B0 83C40C                  add esp, 0000000C
    :0048D8B3 84C0                    test al, al
    :0048D8B5 0F8500040000            jne 0048DCBB
    :0048D8BB E8F060FEFF              call 004739B0    <-- Hier ist ein Wichtiger Call 
    :0048D8C0 84C0                    test al, al      <-- Hier der letzte Vergleich vor der MsgBoxA
    :0048D8C2 7525                    jne 0048D8E9     <-- Hier ist der letzte Jump vor der MsgBoxA
    
    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:0048D8E7(C)         <-- Anfang der Procedure!! (!Das soll nicht mehr kommen!)
    |
    :0048D8C4 6A25                    push 00000025
    
    * Possible StringData Ref from Data Obj ->"Tomb Raider"
                                      |
    :0048D8C6 6838354B00              push 004B3538
    
    * Possible StringData Ref from Data Obj ->"Tomb Raider - The Last Revelation "
                                            ->"CD"
                                      |
    :0048D8CB 6810354B00              push 004B3510
    :0048D8D0 53                      push ebx
    
    * Reference To: USER32.MessageBoxA, Ord:01BEh                 <-- Hier ist die MessageBoxA
                                      |
    :0048D8D1 FF15CC814A00            Call dword ptr [004A81CC]
    :0048D8D7 83F802                  cmp eax, 00000002
    :0048D8DA 0F84DB030000            je 0048DCBB
    :0048D8E0 E8CB60FEFF              call 004739B0               <-- Hier ist nochmals der Call!
    :0048D8E5 84C0                    test al, al
    :0048D8E7 74DB                    je 0048D8C4     <-- Hier springt her zum Anfang der Procedure!
    

    Jetzt könnte man ja denken den letzten Jump zu einem JMP (direct Jump: also immer springen) umzuschreiben, habe ich auch aber dann kommt eine Fehlermeldung und er lädt nicht das Spiel! Also müssen wir mal nachschauen, was er vergleicht.
    Vermutung: Er vergleicht den Rückgabewert aus dem Call mit einem anderen und macht dann den Jump oder nicht. Also schauen wir mal nach wohin er da springt! Geht im ASM Text zur Stelle 004739B0 und ihr findet folgendes...
    * Referenced by a CALL at Addresses:
    |:0048D8BB   , :0048D8E0   
    |
    :004739B0 83EC18                  sub esp, 00000018        <-- Hier springt er hin...
    :004739B3 A1AC174B00              mov eax, dword ptr [004B17AC]
    :004739B8 8B0DB0174B00            mov ecx, dword ptr [004B17B0]
    :004739BE 8B15B4174B00            mov edx, dword ptr [004B17B4]
    :004739C4 53                      push ebx
    :004739C5 8944240C                mov dword ptr [esp+0C], eax
    :004739C9 66A1B8174B00            mov ax, word ptr [004B17B8]
    :004739CF 56                      push esi
    :004739D0 57                      push edi
    :004739D1 894C2418                mov dword ptr [esp+18], ecx
    :004739D5 8954241C                mov dword ptr [esp+1C], edx
    :004739D9 6689442420              mov word ptr [esp+20], ax
    
    * Reference To: KERNEL32.GetLogicalDrives, Ord:0120h
                                      |
    :004739DE FF15E4804A00            Call dword ptr [004A80E4]
    :004739E4 8D4C240C                lea ecx, dword ptr [esp+0C]
    
    * Possible StringData Ref from Data Obj ->"A:\"
                                      |
    :004739E8 68A8174B00              push 004B17A8
    :004739ED 51                      push ecx
    :004739EE 8BD8                    mov ebx, eax
    :004739F0 C605A023530041          mov byte ptr [005323A0], 41
    
    * Reference To: KERNEL32.lstrcpyA, Ord:0302h
                                      |
    :004739F7 FF15E8804A00            Call dword ptr [004A80E8]
    :004739FD 85DB                    test ebx, ebx
    :004739FF 7461                    je 00473A62
    
    * Reference To: KERNEL32.GetDriveTypeA, Ord:0104h          <-- Ups! Was haben wir den da?!
                                      |
    :00473A01 8B3DEC804A00            mov edi, dword ptr [004A80EC]
    ...
    ...
    ...
    
    Ja genau, ein GetDriveTypeA (-> ist eine CD drin?) also prüft er nach der CD... Wie wir hoffentlich wissen ist der positive (für uns) Rückgabewert von einem GetDriveTypeA die 1. Und wir wissen das der Wert in eax steht! Man muss jetzt den eax Wert zu 1 bringen. Man schreibt das schließlichv mit Hilfe von "mov eax, 1"! Aber wohin?
    2 Möglichkeiten!
  • 1: Man schreibt in der ersten Zeile der Procedure (die gecallt wurde) den Rückgabewert und dann ein Return, damit er sofort wieder zurück springt. Siehe...
  • * Referenced by a CALL at Addresses:
    |:0048D8BB   , :0048D8E0   
    |
    :004739B0 83EC18                  mov eax, 00000001      <-- UNSER eax-Wert
    :004739B3 A1AC174B00              ret                    <-- ein Return
    :004739B8 8B0DB0174B00            mov ecx, dword ptr [004B17B0]
    :004739BE 8B15B4174B00            mov edx, dword ptr [004B17B4]
    ...
    ...
    ...
    

  • 2: Man könnte auch den call durch ein mov eax, 00000001 ersetzen. Das ist die Methode die ich vorziehe, denn da ändert man weniger Bytes.
  • :0048D8BB E8F060FEFF              mov eax 00000001 <-- Hier wurde der Call geändert
    :0048D8C0 84C0                    test al, al      <-- Hier der letzte Vergleich vor der MsgBoxA
    :0048D8C2 7525                    jne 0048D8E9     <-- Hier ist der letzte Jump vor der MsgBoxA
    

    Beide Methoden funktionieren in der Tat!
    So, wie ihr es wohl gewohnt seid, schreibt ihr alle Änderungen auf und auch alle Stellen, auch die Hexzahlen für die Stellen. Jetzt dürfte es kein Problem mehr sein die Original "Tomb4.exe" umzuschreiben! Ihr könnt einen Hex Editor benutzen oder eine Programmiersprache und einen crack schreiben.


    Sonstige

    So das war es dann! Wir sehen uns dann hoffentlich in meinem nächsten Tutor! Hoffentlich dauert das nicht wieder so lange. Naja, falls es euch geholfen hat oder ihr noch irgendwelche Fragen habt, dann e-mailt mir einfach (ich freue mich über jede mail)!

    Grüsse gehen raus an die Kryptocrew, Fireball, ultraschall und an den Rest der TGC Crew